/**
 * @file 渲染进程运行时状态管理
 * @description 基于 Pinia 的运行时状态管理解决方案，实现多窗口间的实时状态同步
 *
 * ## 核心特性
 * - 🔄 **实时同步**: 状态变更在所有窗口间实时同步
 * - 💾 **内存存储**: 仅存储在内存中，应用重启后重置
 * - 🎯 **类型安全**: 完整的 TypeScript 类型支持
 * - 📦 **Pinia 集成**: 无缝集成 Vue 3 生态系统
 *
 * @author 黄敏
 * @version 1.0.0
 * @since 2025-06-22
 */

import { CreateState } from './create-runtime-state'

// 缓存已创建的运行时状态实例，按 name 复用，避免重复 new
const runtimeStateCache = new Map<string, CreateState<any>>()

/**
 * 创建运行时状态管理器
 * @description 创建一个支持多窗口同步的运行时状态管理器，状态仅存储在内存中
 *
 * @template T 状态数据类型
 * @param name 状态标识符，用于区分不同的状态实例
 * @param defaultValue 默认状态值，当状态不存在时使用
 * @returns 包含 Pinia store、getter 和 setter 的状态管理对象
 *
 * @example
 * ```typescript
 * // 创建主题状态管理器
 * const themeState = createRuntimeState<'dark' | 'light'>('theme', 'light')
 *
 * // 在组件中使用
 * const { state, set, watch } = themeState.useStore()
 *
 * // 直接获取和设置状态
 * const currentTheme = themeState.getState()
 * themeState.setState('dark')
 * ```
 */

export const createRuntimeState = <T = unknown>(name: string, defaultValue?: T) => {
  const cached = runtimeStateCache.get(name)
  if (cached) return cached as CreateState<T>

  const instance = new CreateState<T>(name, defaultValue as T)

  // 在销毁时，从缓存中移除，防止内存泄漏
  const originalDestroy = instance.destroy.bind(instance)
  instance.destroy = () => {
    runtimeStateCache.delete(name)
    originalDestroy()
  }

  runtimeStateCache.set(name, instance as CreateState<any>)
  return instance
}

/**
 * 系统主题状态管理器
 * @description 预定义的系统主题状态管理，支持 'dark' 和 'light' 两种主题
 *
 * @example
 * ```typescript
 * // 在组件中使用
 * const { state: theme, set: setTheme } = systemThemeState.useStore()
 *
 * // 切换主题
 * setTheme(theme.value === 'dark' ? 'light' : 'dark')
 * ```
 */
export const systemThemeState = createRuntimeState<'dark' | 'light' | 'system'>('systemTheme')
